package com.zhw.learning.designpattern.proxypattern.dynamicproxy;

import lombok.extern.slf4j.Slf4j;
import org.springframework.cglib.proxy.InvocationHandler;

import java.lang.reflect.Method;

/**
 * @author Administrator
 * 代理类
 */
@Slf4j
public class Proxy2 implements InvocationHandler {

    private Object object;

    public Proxy2(Object object){
        this.object = object;
    }

    /**
     * @param o 真实角色的对象
     * @param method 要调用的真实对象的方法
     * @param objects 要调用的真实对象方法的参数列表
     * @return
     * @throws Throwable
     */
    @Override
    public Object invoke(Object o, Method method, Object[] objects) throws Throwable {
        // 在代理真实对象前我们可以添加一些自己的操作
        log.info("JDK代理前置内容 ... ");
        // 当代理对象调用真实对象的方法时，其会自动的跳转到代理对象关联的handler对象的invoke方法来进行调用
        Object obj = method.invoke(object,objects);
        // 在代理真实对象后我们也可以添加一些自己的操作
        log.info("JDK代理后置内容 ... ");
        return obj;

    }
}
